/*:
 * @plugindesc （新枫之舞专用）路人战斗
 * @author 小c
 *
 * @param Stranger Index
 * @text 路人序号
 * @type number
 * @default 20
 * @desc 敌人攻击路人所指的序号，序号必须大于所有战斗的最大敌人数
 * 
 * @help 
 * 定义路人战斗成员，我方不可攻击但敌人可以攻击
 * 需要YEPAI核心支持
 *
 * 路人定义
 * 敌人标签 <Stranger>
 * 定义该敌人为路人
 * 路人敌人我方技能无法选择，我方群攻技能无法攻击
 * 敌人单体攻击技能可以攻击路人，恢复技能无法选择路人
 *
 * 敌人攻击路人的方法：AI配置
 * YEPAI核心中添加了一个目标参数：Stranger
 * Stranger表示随机一个路人敌人，此目标只对单体攻击技能有效
 * 例子：
 * <AI Priority>
 * Random 50%: Skill 5: Stranger
 * Always: Skill 1, <<nothing>>
 * </AI Priority>
 * 这里的5号技能必须是单体攻击技能，否则无效
 *
 * AI配置中的攻击路人，在战斗中没有路人时会被忽略
 * 因此攻击路人有关AI可以在普通敌人中正常配置
 *
 * 路人属于敌群，因此路人会主动攻击玩家
 *
 * 关于战斗结算
 * 我方消灭除了路人外的所有敌人，战斗胜利
 * 战斗胜利后，路人不提供任何经验金钱与物品
*/

var Imported =  Imported || {};
Imported.CP_BattleStranger = true;

var CP = CP || {};
CP.BattleStranger = CP.BattleStranger || {};
CP.BattleStranger.Params = PluginManager.parameters("CP_BattleStranger");
CP.BattleStranger.STRANGER_INDEX = Number(CP.BattleStranger.Params["Stranger Index"]) || 20;

CP.BattleStranger._loaded = false;
CP.BattleStranger.DATABASE_LOADED = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function(){
	if(!CP.BattleStranger.DATABASE_LOADED.call(this))
		return false;

	if(!CP.BattleStranger._loaded){
		CP.BattleStranger.loadBattleStranger();
		CP.BattleStranger._loaded = true;
	}

	return true;
};

CP.BattleStranger.loadBattleStranger = function(){
	for(var i = 1; i < $dataEnemies.length; i++){
		var enemy = $dataEnemies[i];
		enemy.stranger = false;
		if(enemy.meta["Stranger"])
			enemy.stranger = true;
	}
};

//------------------------------------------
// Game_Enemy
//------------------------------------------
Game_Enemy.prototype.isStranger = function(){
	var enemy = this.enemy();
	return !!enemy ? enemy.stranger : false;
};

//结算相关，如果路人被打死了，不计算经验金钱与物品
CP.BattleStranger.ENEMY_EXP = Game_Enemy.prototype.exp;
Game_Enemy.prototype.exp = function(){
    return this.isStranger() ? 0 : CP.BattleStranger.ENEMY_EXP.call(this);
};

CP.BattleStranger.ENEMY_GOLD = Game_Enemy.prototype.gold;
Game_Enemy.prototype.gold = function(){
    return this.isStranger() ? 0 : CP.BattleStranger.ENEMY_GOLD.call(this);
};

CP.BattleStranger.ENEMY_DROP_ITEM_RATE = Game_Enemy.prototype.dropItemRate;
Game_Enemy.prototype.dropItemRate = function(){
	return this.isStranger() ? 0 : CP.BattleStranger.ENEMY_DROP_ITEM_RATE.call(this);
};

//------------------------------------------
// Game_Troop
//------------------------------------------
CP.BattleStranger.TROOP_ALIVE_MEMBERS = Game_Troop.prototype.aliveMembers;
Game_Troop.prototype.aliveMembers = function(){
	return CP.BattleStranger.TROOP_ALIVE_MEMBERS.call(this).filter(function(enemy){
		return !enemy.isStranger();
	});
};

//所有的路人敌人
Game_Troop.prototype.strangerMembers = function(){
	return this.members().filter(function(enemy){
		return enemy.isStranger();
	});
};

//所有的存活路人敌人
Game_Troop.prototype.aliveStrangerMembers = function(){
	return this.strangerMembers().filter(function(enemy){
		return enemy.isAlive();
	});
};

Game_Troop.prototype.hasAliveStrangerMembers = function(){
	return this.aliveStrangerMembers().length > 0;
};

//------------------------------------------
// Game_Party
//------------------------------------------
CP.BattleStranger.PARTY_SMOOTH_TARGET = Game_Troop.prototype.smoothTarget;
Game_Party.prototype.smoothTarget = function(index){
	if(index === CP.BattleStranger.STRANGER_INDEX)
		return this.randomStrangerTarget();
	else
		return CP.BattleStranger.PARTY_SMOOTH_TARGET.call(this, index);
};

Game_Party.prototype.randomStrangerTarget = function(){
	var strangers = $gameTroop.aliveStrangerMembers();
	var randomIndex = Math.floor(Math.random() * strangers.length);
	if(strangers.length <= 0)
		return CP.BattleStranger.PARTY_SMOOTH_TARGET.call(this, 0);
	else
		return strangers[randomIndex];
};

//------------------------------------------
// AIManager
//------------------------------------------
//是否为AI路人目标
AIManager.isStrangerTarget = function(){
	var line = this._aiTarget.toUpperCase();
	return line.match(/STRANGER/i);
};

CP.BattleStranger.AIMANAGER_SET_PROPER_TARGET = AIManager.setProperTarget;
AIManager.setProperTarget = function(group){
	var action = this.action();
	if (action.subject().isEnemy() && action.isForOpponent() && action.isForOne() && this.isStrangerTarget()){
		this.setActionGroup(group);
		action.setTarget(CP.BattleStranger.STRANGER_INDEX); //设置目标序号为它时，目标为随机路人
	}else
		CP.BattleStranger.AIMANAGER_SET_PROPER_TARGET.call(this, group);
};

CP.BattleStranger.AIMANAGER_PASS_AI_CONDITIONS = AIManager.passAIConditions;
AIManager.passAIConditions = function(line){
	if(!$gameTroop.hasAliveStrangerMembers() && this.isStrangerTarget())
		return false;
	else
		return CP.BattleStranger.AIMANAGER_PASS_AI_CONDITIONS.call(this, line);
};